package kotlinquanweizhinan.chapt05匿名函数与函数类型.定义参数是函数的函数

class SimVillage {
}

fun main(args:Array<String>) {
    val greetingFunction = {playerName:String,numBuildings:Int ->
        val currentYear= 2022
        println("Adding $numBuildings houses")
        "Welcome to SimVillage,$playerName!(copyreight $currentYear)"
    }
    //使用函数变量
    runSimulation("Guyal", greetingFunction)


    runSimulation("Guyal", {playerName:String,numBuildings:Int ->
        val currentYear= 2022
        println("Adding $numBuildings houses")
        "Welcome to SimVillage,$playerName!(copyreight $currentYear)"
    })


    /**
     * 如果一个函数的lambda参数排在最后，或者是唯一的参数，那么括住lambda值参的一对圆括号就可以省略。
     */
    //简略语法: 使用lambda表达式
    runSimulation("Guyal"){ playerName,numBuildings ->
        val currentYear = 2018
        println("Adding $numBuildings houses")
        "Welcome to SimVillage,$playerName!(copyreight $currentYear)"
    }

    /**
     * 这种简略写法只支持lambda参数排在最后的情况，所以，定义函数时，建议把函数类型的参数放在最后，以方便调用者使用。
     */

}

/** 随机确定已建成了多少栋房子，然后调用lambda输出欢迎语句。
 * runSimulation函数有两个参数，一个是玩家的名字，一个是greetingFunction。
 * 其中，greetingFunction也是一个函数，它也有两个参数，一个String类型和一个
 * Int类型，它返回String类型的数据。runSimulation函数首先产生一个随机数。然
 * 后，使用随机数和玩家名(传入的值参)，调用传入的greetingFunction函数。
 */
fun runSimulation(playerName:String, greetingFunction:(String,Int) ->String) {
    val numBuildings = (1..3).shuffled().last() //Randomly selects 1,2,or3
    println(greetingFunction(playerName,numBuildings))
}
